/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package animacion;

import cern.jet.random.Poisson;
import cern.jet.random.engine.DRand;
import cern.jet.random.engine.RandomEngine;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import java.lang.String;

/**
 *
 * @author David
 */
public class generador extends Thread {

    private double tasa;
    private int servidos = 0;
    public static double transcurrido = 0;
    private boolean simulacion = true;
    private cola C;
    private salida S;
    private double tiempo;
    RandomEngine rand = new DRand();
    private LinkedList<servidor> servidores;
    Poisson p;

    public generador(double tasa, LinkedList<servidor> servidores, salida S, cola C,JLabel entrada,JLabel salida,JLabel cola,JPanel panel,JSeparator separador,double total) {
        this.tasa = tasa;
        this.servidores = servidores;
        p = new Poisson(1 / tasa, rand);
        this.C = C;
        C.agregarAnimacion(entrada, salida, cola, panel, separador);
        this.S = S;
        this.tiempo=total;
    }

    public void terminar() {
        this.simulacion = false;
    }

    @Override
    public void run() {
        double pass = 0;
        double contador = 0;
        for (int c = 0; c < servidores.size(); c++) {
            servidores.get(c).agregarAnimacion();
            servidores.get(c).tanscurrido=this.transcurrido;
            servidores.get(c).start();
            try {
                Thread.sleep(50);
            } catch (InterruptedException ex) {
                Logger.getLogger(generador.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        
        while (simulacion) {
            pass = p.nextDouble();
            while (contador < pass && simulacion == true) {
                contador = contador + 0.1;
                try {
                    Thread.sleep(100);
                } catch (InterruptedException ex) {
                    Logger.getLogger(generador.class.getName()).log(Level.SEVERE, null, ex);
                }
                transcurrido = transcurrido + 0.1;
            }
            servidos++;
            objeto nuevo = new objeto(transcurrido, servidos);
            C.agregar(nuevo);
            contador = 0;
            if(transcurrido>tiempo)
            {
                simulacion=false;
            }

        }
        for (int c = 0; c < servidores.size(); c++) {
            servidores.get(c).detener();
        }
        int falsos = 0;
        do {
            falsos = 0;
            for (int c = 0; c < servidores.size(); c++) {
                if (servidores.get(c).parototal == false) {
                    falsos++;
                    break;

                }
            }


        } while (falsos > 0);
        double ObToSis=0;
        for(int c=0;c<servidores.size();c++)
        {
         double parcial=0;
         parcial = servidores.get(c).getObjetosservidos()/transcurrido;
         ObToSis= ObToSis+parcial;
        }
        int encola=0;
        for(int c = 0;c<C.estadistica.size();c++)
        {
            encola = encola + C.estadistica.get(c);
        }
            encola = encola/C.estadistica.size();
        double tiempocola=0;
        double tiemposistema=0;
        for(int c=0;c<S.C.size();c++)
        {
            tiempocola = tiempocola + (S.C.get(c).getFincola()-S.C.get(c).getIniciosistema());
        }
        tiempocola=tiempocola/S.C.size();
        for(int c=0;c<S.C.size();c++)
        {
            tiemposistema = tiemposistema + (S.C.get(c).getFinsistema()-S.C.get(c).getIniciosistema());
        }
        tiemposistema=tiemposistema/S.C.size();
        modelasimu.ventanaResultados salida = new modelasimu.ventanaResultados();
        String[] valores = new String[8];
        valores[0]=""+this.tasa+ " Clientes/Segundo";
        valores[1]=""+Math.rint((encola)*100)/100+ " Clientes en cola";
        valores[2]=""+Math.rint((encola+ObToSis)*100)/100+ "Clientes en Sistema";
        valores[3]=""+Math.rint((tiempocola)*100)/100+ " Segundo";
        valores[4]=""+Math.rint((tiemposistema)*100)/100 +" Segundo";
        valores[5]=""+servidos+ " Clientes";
        valores[6]=""+S.Atendidos()+ " Clientes";
        valores[7]=""+C.S.C.size()+ " Clientes";
        
        salida.setInfoServidores(this.servidores);
        salida.setInfo(valores);
        salida.show();
        
        System.out.println("Servidor en generados " + servidos + " en " + transcurrido + " segundos ");
        System.out.println(" Objetos en la Cola " + C.C.size());
        System.out.println("Servidos en total " + S.Atendidos());
        
    }
}
